home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / c / dice-3.16.lha / examples / Printer_Driver / dospecial.c < prev    next >
C/C++ Source or Header  |  1998-09-27  |  4KB  |  212 lines

  1.  
  2. /*
  3.  *  DOSPECIAL.C
  4.  *
  5.  *  David Berezowski - March/88.
  6.  *  Modified for DICE - May/91    Matthew Dillon
  7.  *
  8.  *  Copyright (c) 1988  Commodore-Amiga, Inc.
  9.  *  (c)Copyright 1991 Matthew Dillon
  10.  */
  11.  
  12. #include "defs.h"
  13.  
  14. #define ESC 27
  15.  
  16. static short Lpi  = 6;
  17. static short Is15 = 0;
  18. static short LeftMargin = 1;
  19. static short RightMargin= 80;
  20. static char *Buffer;
  21.  
  22. Prototype __geta4 DoSpecial(UWORD *, char *, BYTE *, BYTE *, BYTE *, UBYTE *);
  23. Prototype char *SetQuality(char *, short);
  24. Prototype char *SetPitch(char *, short);
  25. Prototype char *SetLPI(char *, short, char *);
  26. Prototype char *SetMargins(char *, short, short);
  27.  
  28. __geta4 long
  29. DoSpecial(command, outputBuffer, vline, currentVMI, crlfFlag, Parms)
  30. char outputBuffer[];
  31. UWORD *command;
  32. BYTE *vline;
  33. BYTE *currentVMI;
  34. BYTE *crlfFlag;
  35. UBYTE Parms[];
  36. {
  37.     char *ptr = outputBuffer;
  38.     short n;
  39.  
  40.     /*
  41.      *    *ptr++ = '<';
  42.      *    *ptr++ = *command / 10 + '0';
  43.      *    *ptr++ = *command % 10 + '0';
  44.      *    *ptr++ = '>';
  45.      */
  46.  
  47.     switch(*command) {
  48.     case aRIS:            /*    Reset        */
  49.     *ptr++ = ESC;
  50.     *ptr++ = '@';
  51.  
  52.     /* FALL THROUGH */
  53.     case aRIN:            /*    Initialize  */
  54.     *ptr++ = 24;        /*    Cancel line        */
  55.     *ptr++ = ESC;        /*    Cancel MSB control  */
  56.     *ptr++ = '#';
  57.     *ptr++ = ESC;        /*    master select everything off    */
  58.     *ptr++ = '!';
  59.     *ptr++ = 0;
  60.  
  61.     Lpi = (PD->pd_Preferences.PrintSpacing & EIGHT_LPI) ? 8 : 6;
  62.  
  63.     ptr = SetQuality(ptr, PD->pd_Preferences.PrintQuality == LETTER);
  64.     ptr = SetPitch(ptr, PD->pd_Preferences.PrintPitch);
  65.     ptr = SetLPI(ptr, Lpi, currentVMI);
  66.     ptr = SetMargins(ptr, PD->pd_Preferences.PrintLeftMargin,
  67.                   PD->pd_Preferences.PrintRightMargin
  68.             );
  69.     break;
  70.     case aSHORP3:   /* 18 condensed fine off            */
  71.     case aSHORP1:   /* 16 aSHORP1 elite off            */
  72.     case aSHORP0:   /* 14 aSHORP0 normal pitch            */
  73.     ptr = SetPitch(ptr, PICA);
  74.     ptr = SetLPI(ptr, Lpi, currentVMI);
  75.     break;
  76.     case aSHORP2:   /* 15 aSHORP2 elite on    (12)        */
  77.     ptr = SetPitch(ptr, ELITE);
  78.     ptr = SetLPI(ptr, Lpi, currentVMI);
  79.     break;
  80.     case aSHORP4:   /* 17 aSHORP4 condensed fine on  (15)   */
  81.     ptr = SetPitch(ptr, FINE);
  82.     ptr = SetLPI(ptr, Lpi, currentVMI);
  83.     break;
  84.     case aSUS3:     /*    aSUS3    */
  85.     case aSUS1:     /*    aSUS1    */
  86.     case aSUS0:     /*    aSUS0    */
  87.     *ptr++ = ESC;
  88.     *ptr++ = 'T';
  89.     break;
  90.     case aSUS2:     /*    aSUS2    superscript        */
  91.     *ptr++ = ESC;
  92.     *ptr++ = 'S';
  93.     *ptr++ = '0';
  94.     break;
  95.     case aSUS4:     /*    aSUS4    subscript        */
  96.     *ptr++ = ESC;
  97.     *ptr++ = 'S';
  98.     *ptr++ = '1';
  99.     break;
  100.     case aSLRM:     /*    Set left & right margins    */
  101.     ptr = SetMargins(ptr, Parms[0], Parms[1]);
  102.     break;
  103.     case aCAM:            /*    Cancel Margins        */
  104.     n = PD->pd_Preferences.PaperSize == W_TRACTOR ? 136 : 80;
  105.     switch(PD->pd_Preferences.PrintPitch) {
  106.     case PICA:
  107.         n = 10 * n / 10;
  108.         break;
  109.     case ELITE:
  110.         n = 12 * n / 10;
  111.         break;
  112.     default:
  113.         n = 15 * n / 10;
  114.         break;
  115.     }
  116.     ptr = SetMargins(ptr, 1, n);
  117.     break;
  118.     case aVERP0:    /*    8 LPI    */
  119.     ptr = SetLPI(ptr, 8, currentVMI);
  120.     break;
  121.     case aVERP1:    /*    6 LPI    */
  122.     ptr = SetLPI(ptr, 6, currentVMI);
  123.     break;
  124.     case aSLPP:     /*    set form length */
  125.     *ptr++ = ESC;
  126.     *ptr++ = 'C';
  127.     *ptr++ = Parms[0];
  128.     break;
  129.     case aPERF:     /*    perf skip n    */
  130.     *ptr++ = ESC;
  131.     *ptr++ = 'N';
  132.     *ptr++ = Parms[0];
  133.     break;
  134.     }
  135.     return(ptr - outputBuffer);
  136. }
  137.  
  138. char *
  139. SetQuality(ptr, letter)
  140. char *ptr;
  141. short letter;
  142. {
  143.     *ptr++ = ESC;
  144.     *ptr++ = 'x';
  145.     *ptr++ = (letter) ? 1 : 0;
  146.     return(ptr);
  147. }
  148.  
  149. char *
  150. SetPitch(ptr, printpitch)
  151. char *ptr;
  152. short printpitch;
  153. {
  154.     *ptr++ = ESC;
  155.  
  156.     switch(printpitch) {
  157.     case FINE:        /*  15 pitch    */
  158.     Is15 = 2;
  159.     *ptr++ = 'g';
  160.     break;
  161.     case ELITE:     /*  12 pitch    */
  162.     Is15 = 0;
  163.     *ptr++ = 'M';
  164.     break;
  165.     default:        /*  10 pitch PICA   */
  166.     Is15 = 0;
  167.     *ptr++ = 'P';
  168.     break;
  169.     }
  170.     return(ptr);
  171. }
  172.  
  173. char *
  174. SetLPI(ptr, lpi, cvmi)
  175. char *ptr;
  176. short lpi;
  177. char *cvmi;
  178. {
  179.     Lpi = lpi;
  180.     lpi += Is15;    /*  If 15 pitch, lpi += 2        */
  181.     *cvmi = 180 / lpi;    /*  Current Vertical Margin Increment    */
  182.  
  183.     if (lpi == 8) {     /*  8 doesn't divide evenly into 180    */
  184.     *ptr++ = ESC;
  185.     *ptr++ = '0';
  186.     } else {
  187.     *ptr++ = ESC;
  188.     *ptr++ = '3';
  189.     *ptr++ = 180 / (lpi ? lpi : 1);     /* ensure no divide by 0   */
  190.     }
  191.     return(ptr);
  192. }
  193.  
  194. char *
  195. SetMargins(ptr, left, right)
  196. char *ptr;
  197. short left;
  198. short right;
  199. {
  200.     LeftMargin = left;
  201.     RightMargin= right;
  202.  
  203.     *ptr++ = ESC;
  204.     *ptr++ = 'l';
  205.     *ptr++ = left;
  206.     *ptr++ = ESC;
  207.     *ptr++ = 'Q';
  208.     *ptr++ = right;
  209.     return(ptr);
  210. }
  211.  
  212.